﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Szamlazz.Utils
{
	/// <summary>
	/// Adó fajtákat tartalmazó osztály
	/// </summary>
	public static class Taxes
	{ 
		public static IReadOnlyDictionary<string, VATType> Codes { get { return Taxes.Data; } }
		private static ReadOnlyDictionary<string, VATType> Data { get; set; }

		static Taxes()
		{
			Data = new ReadOnlyDictionary<string, VATType>();

			Data.Add("TAM", new VATType("TAM", "tárgyi adómentes", 0));
			Data.Add("AAM", new VATType("AAM", "alanyi adómentes", 0));
			Data.Add("EU", new VATType("EU", "EU-n belül", 0));
			Data.Add("EUK", new VATType("EUK", "EU-n kívül", 15));
			Data.Add("MAA", new VATType("MAA", "mentes az adó alól", 0));
			Data.Add("F.AFA", new VATType("F.AFA", "fordított áfa", 0));
			Data.Add("K.AFA", new VATType("K.AFA", "különbözeti áfa", 0, true));
			Data.Add("ÁKK", new VATType("ÁKK", "áfa körön kívüli", 0));
			Data.Add("0", new VATType("0", "0% ÁFA érték", 0));
			Data.Add("5", new VATType("5", "5% ÁFA érték", 5));
			Data.Add("7", new VATType("7", "7% ÁFA érték", 7));
			Data.Add("18", new VATType("18", "18% ÁFA érték", 18));
			Data.Add("19", new VATType("19", "19% ÁFA érték", 19));
			Data.Add("20", new VATType("20", "20% ÁFA érték", 20));
			Data.Add("25", new VATType("25", "25% ÁFA érték", 25));
			Data.Add("27", new VATType("27", "27% ÁFA érték", 27));
		}

	}

	/// <summary>
	/// Adó fajtája
	/// </summary>
	public sealed class VATType
	{
		/// <summary>
		/// Adó fajta kódja
		/// </summary>
		public string Code { get; private set; }
		/// <summary>
		/// Leírása
		/// </summary>
		public string Description { get; private set; }
		/// <summary>
		/// Alkalmazott százalék
		/// </summary>
		public double Percent { get; private set; }
		/// <summary>
		/// Különbözetre vonatkozó-e
		/// </summary>
		public bool Differential { get; private set; }

		/// <summary>
		/// Létrehozza a példányt
		/// </summary>
		/// <param name="code">Kód</param>
		/// <param name="description">Leírás</param>
		/// <param name="value">Érték (%)</param>
		/// <param name="differential">Különbözeti</param>
		internal VATType(string code, string description, double value, bool differential = false)
		{
			this.Code = code;
			this.Percent = value;
			this.Description = description;
			this.Differential = differential;

			this.Calculate();
		}

		/// <summary>
		/// Kalkulálja az adó százalékot és a fordított számítást
		/// </summary>
		private void Calculate()
		{
			this.Value = (double)this.Percent / 100D;
			this.ReversedValue = ((double)this.Percent) / ((double)(this.Percent + 100D));
		}

		/// <summary>
		/// Beállítja a megadott értéket az adó fajtán
		/// </summary>
		/// <param name="vat">Egy másik fajta példánya</param>
		public void SetValue(VATType vat)
		{
			if (this.Differential)
			{
				this.Percent = vat.Percent;
			}
			else
			{
				throw new InvalidOperationException("Csak a különbözeti áfa (K.AFA) mértéke adható meg!");
			}
		}

		/// <summary>
		/// Adó mértéke
		/// </summary>
		internal double Value { get; private set; }
		/// <summary>
		/// Fordított számítás mértéke
		/// </summary>
		internal double ReversedValue { get; private set; }
	}
}
